1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package com.google.common.collect;
16
17 import static com.google.common.base.Preconditions.checkArgument;
18
19 import com.google.common.annotations.GwtCompatible;
20 import com.google.common.annotations.GwtIncompatible;
21
22 import java.io.IOException;
23 import java.io.ObjectInputStream;
24 import java.io.ObjectOutputStream;
25 import java.util.EnumMap;
26 import java.util.Iterator;
27
28
29
30
31
32
33
34
35
36
37
38 @GwtCompatible(emulated = true)
39 public final class EnumMultiset<E extends Enum<E>> extends AbstractMapBasedMultiset<E> {
40
41 public static <E extends Enum<E>> EnumMultiset<E> create(Class<E> type) {
42 return new EnumMultiset<E>(type);
43 }
44
45
46
47
48
49
50
51
52
53
54 public static <E extends Enum<E>> EnumMultiset<E> create(Iterable<E> elements) {
55 Iterator<E> iterator = elements.iterator();
56 checkArgument(iterator.hasNext(), "EnumMultiset constructor passed empty Iterable");
57 EnumMultiset<E> multiset = new EnumMultiset<E>(iterator.next().getDeclaringClass());
58 Iterables.addAll(multiset, elements);
59 return multiset;
60 }
61
62
63
64
65
66
67
68
69 public static <E extends Enum<E>> EnumMultiset<E> create(Iterable<E> elements, Class<E> type) {
70 EnumMultiset<E> result = create(type);
71 Iterables.addAll(result, elements);
72 return result;
73 }
74
75 private transient Class<E> type;
76
77
78 private EnumMultiset(Class<E> type) {
79 super(WellBehavedMap.wrap(new EnumMap<E, Count>(type)));
80 this.type = type;
81 }
82
83 @GwtIncompatible("java.io.ObjectOutputStream")
84 private void writeObject(ObjectOutputStream stream) throws IOException {
85 stream.defaultWriteObject();
86 stream.writeObject(type);
87 Serialization.writeMultiset(this, stream);
88 }
89
90
91
92
93
94
95 @GwtIncompatible("java.io.ObjectInputStream")
96 private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
97 stream.defaultReadObject();
98 @SuppressWarnings("unchecked")
99 Class<E> localType = (Class<E>) stream.readObject();
100 type = localType;
101 setBackingMap(WellBehavedMap.wrap(new EnumMap<E, Count>(type)));
102 Serialization.populateMultiset(this, stream);
103 }
104
105 @GwtIncompatible("Not needed in emulated source")
106 private static final long serialVersionUID = 0;
107 }